package com.java.reflect.proxy.dynamic;

import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;
import java.lang.reflect.Proxy;
import java.util.List;
import java.util.Vector;

public class ProxyHandler implements InvocationHandler{

	//真实对象
	private Object proxyRealObj;
	
	public ProxyHandler(Object proxyRealObj){
		this.proxyRealObj = proxyRealObj;
	}

	@Override
	public Object invoke(Object proxy,Method method,Object[] args)
		throws Throwable{
		/**
		 * 这里调用toString()导致方法无限嵌套，导致栈溢出
		 * System.out.println(proxy);
		 **/
		// proxy就是创建的代理类
		//System.out.println(proxy.getClass().getName());
		Object obj = method.invoke(proxyRealObj, args);
		return obj;
	}
	
	public static Object factory(Object realRole){
		Class<?> classType = realRole.getClass();
		//返回代理对象$Proxy0: 类加载器     classType.getInterfaces()是抽象对象  调用处理器
		Object proxyObj = Proxy.newProxyInstance(classType.getClassLoader(), classType.getInterfaces(), new ProxyHandler(realRole));
		return proxyObj;
	}
	
	public static void main(String[] args) {
		List list = (List)factory(new Vector());
		/** 根据Vector接口信息创建了Vector的代理类$Proxy0，使用指定类加载器加载代理类，创建代理对象
		 * 	该代理对象包含了一个调用处理器对象，调用处理器对象拥有对真实对象的引用
		 * 	代理对象调用方法时，在调用的代理对象的方法内部，
		 * 	封装Method对象，通过调用处理器invoke()，调用真实对象的方法
		 **/
		list.add("heel");
	}
}
